/*
    作者：zx
    时间：2022.11.11
    描述：内核自带的功能函数 字符串相关和内存相关
*/

#ifndef KLIB_H
#define KLIB_H

#include "comm/types.h"
#include <stdarg.h>
// 字符串复制  src -> dest
void kernel_strcpy(char * dest, const char * src);
// 字符串复制size个字符  src -> dest
void kernel_strncpy(char * dest, const char * src, int size);
// 字符串比较
int kernel_strcmp(const char * s1, const char * s2);
// 字符串比较size个字符
int kernel_strncmp(const char * s1, const char * s2, int size);
// 字符串长度
int kernel_strlen(const char * s);

     
// 内存复制
void kernel_memcpy(void * dest, void * src, int size);
// 内存设置
void kernel_memset(void * dest, uint8_t v, int size);
// 内存比较
int kernel_memcmp(void * dest1, void * dest2, int size);
// 字符串格式化输出具体实现
void kernel_vsprintf(void * src, const char * fmt, va_list args);
//  字符串格式化输出调用函数
void kernel_sprintf(char * buff, const char * fmt, ...);
// 整数转字符串
void kernel_itoa(char * src, int num, int decimal);

#ifndef RELEASE
#define ASSERT(expr) if(!(expr)) pannic(__FILE__, __LINE__, __func__, #expr)
#else
#define ASSERT(expr) ((void)0)
#endif // !RELEASE


void pannic(const char * file, const int line, const char * func, const char * cond);

// 地址向低地址对齐
static inline uint32_t align_bound_down(uint32_t size, uint32_t bound)
{
    return (size / bound) * bound;
}

// 地址向高地址对齐
static inline uint32_t align_bound_up(uint32_t size, uint32_t bound)
{
    // return (size + bound - 1) / bound * bound;
    // return (size + bound - 1) & ~(bound - 1);
    return (size + bound - 1) & ~(bound - 1);
}

char * get_file_name_from_path(char * file_path);
int get_strings_count(char ** start); 


#endif // !KLIB_H